/*
题目描述
给出一个二叉树的前序遍历序列和后序遍历序列的字符串，问通过这两个序列可以构造多少种不同的二叉树。

输入格式
输入包含两行：

第一行是二叉树的前序遍历序列
第二行是二叉树的后序遍历序列
输出格式
输出一个整数，表示可以构造的不同二叉树的数量。

输入样例
ABDCEFG
DBEGFCA
输出样例
4
*/
#include <bits/stdc++.h>
using namespace std;

int dfs(const string &pre, int pl, int pr, const string &post, int hl, int hr) {
    if (pl > pr) return 1; // 空树
    if (pl == pr) return 1; // 单节点

    // pre[pl] 是根，pre[pl+1] 是左子树根（如果有子树）
    char leftRoot = pre[pl + 1];
    // 找到 leftRoot 在后序的位置
    int pos = -1;
    for (int i = hl; i <= hr; ++i) {
        if (post[i] == leftRoot) {
            pos = i;
            break;
        }
    }

    // 左子树大小
    int leftSize = pos - hl + 1;
    // 判断是否有右子树
    int leftPreL = pl + 1, leftPreR = pl + leftSize;
    int rightPreL = leftPreR + 1, rightPreR = pr;
    int leftPostL = hl, leftPostR = pos;
    int rightPostL = pos + 1, rightPostR = hr - 1;

    if (rightPreL > rightPreR) {
        // 只有一个子树 → 可以作为左或右
        return 2 * dfs(pre, leftPreL, leftPreR, post, leftPostL, leftPostR);
    } else {
        // 左右子树都存在
        int leftCount = dfs(pre, leftPreL, leftPreR, post, leftPostL, leftPostR);
        int rightCount = dfs(pre, rightPreL, rightPreR, post, rightPostL, rightPostR);
        return leftCount * rightCount;
    }
}

int main() {
    string pre, post;
    cin >> pre >> post;
    cout << dfs(pre, 0, pre.size() - 1, post, 0, post.size() - 1) << endl;
    return 0;
}
